/**
 *
 * gislin
 * 2016年2月2日
 */
package com.hrt.datasender.datasent.socket;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map.Entry;

import com.btcode.log.ILog;
import com.hrt.datasender.datadao.service.BdSendRecordService;
import com.hrt.datasender.datasent.DataSender;
import com.hrt.datasender.datastorage.StorageDataType;
import com.hrt.datasender.mq.model.PacketModel;

/**
 * @author gislin 2016年2月2日
 */
public final class SocketClientManager {

    private HashMap<String, SocketClient> clientList = new HashMap<>();
    private ILog log;
    private static SocketClientManager instance;

    private SocketClientManager() {
        log = DataSender.log;
    }

    public static SocketClientManager getInstance() {
        if (instance == null) {
            instance = new SocketClientManager();
        }
        return instance;
    }

    public void addClient(SocketClient client) {
        if (client == null) {
            return;
        }
        String clientId = client.getClientId();
        clientList.put(clientId, client);
    }

    /**
     * 获取socket客户端集合 gislin 2016年2月18日
     *
     * @return
     */
    public HashMap<String, SocketClient> getClient() {
        return clientList;
    }

    /**
     * 连接远程服务器 gislin 2016年2月2日
     */
    public void start() {
        Iterator<Entry<String, SocketClient>> entryset = clientList.entrySet().iterator();
        while (entryset.hasNext()) {
            Entry<String, SocketClient> entry = entryset.next();
            SocketClient client = entry.getValue();
            client.startNetty();
        }
    }

    /**
     * 发送心跳 gislin 2016年2月2日
     */
    public void sendHeartBreak() {
        Iterator<Entry<String, SocketClient>> entryset = clientList.entrySet().iterator();
        while (entryset.hasNext()) {
            Entry<String, SocketClient> entry = entryset.next();
            SocketClient client = entry.getValue();
            log.info("发送心跳:" + client.getClientId());
            // client.sendHeartBreak();
            log.info("发送心跳完毕:" + client.getClientId());
        }
    }

    /**
     * 发送消息 gislin 2016年2月2日 执行结果监听器，可以在执行成功或者失败后执行指定逻辑
     */
    public boolean sendMsg(PacketModel model) {
        try {
            SocketClient client = clientList.get(model.getIp() + "_" + model.getPort());
            if (client != null && client.isClientPrepared()) {
                client.writeMsg(model.getMsg());
                log.info(model.getIp() + "发送数据成功:" + model.getMsg());
                BdSendRecordService.getInstance().updateSendRecordQn(model.getDataType(),model.getIp(),
                    model.getPort(),model.getQn());
                return true;
            }
        } 
        catch (Exception e) {
            log.error("发送数据出错" + model, e);
        }
        return false;
    }

    /**
     * 更新最后心跳时间 gislin 2016年2月18日
     *
     * @param id
     */
    public void updateHeartBreakTime(String id) {
        SocketClient client = clientList.get(id);
        client.updateLastHeartBreakTime();
    }

}
